#include <iostream>

//拷贝构造：如果一个构造函数的第一个参数是类类型的引用，成为拷贝构造

//作用，一定时机被系统自动调用
//默认情况下，系统自动生成的默认构造会逐个变量拷贝，如果是自定义了拷贝构造这种特性就会消失
class Time{
public:
    Time(){

    }

    //这种的带一个参数的构造函数，一般要加上explicit,如果不加的话，有可能会发生隐式类型转换，他会将一个数字隐式转化成一个对象
    //因此要注意这样的带一个参数的构造函数
    //拷贝构造不要加
    explicit Time(int val){


    }

    //拷贝构造一般不用用explicit，expicit是为了防止隐式转换
    Time(const Time&t){
        this->year=t.year;
        this->month=t.month;
        this->day=t.day;
    }


private:
    int year;
    int month;
    int day;

};

int main(){
    //调用构造函数
    Time t1=Time();
    Time t2;
    Time t3=Time{};
    Time t4{};
    Time t5={}; 

    //对象拷贝:用一个对象初始化另一个函数
    Time h1;
    Time h2=h1;
    Time h3(h1);
    Time h4{h1};


    return 0;
}

//会发生拷贝构造的情况
//将一个函数对象作为形式参数传入到一个函数，会发生从实参到形参的拷贝，因此会调用拷贝构造函数
void func(Time t){

}

//一个函数内部定义一个局部变量，这时会调用构造函数
//当这个局部变量作为函数的返回值，会发生一次拷贝构造，即局部变量拷贝到一个隐式的函数返回值中去

Time func(){

    Time t;
    //这里实际上产生了一个临时对象，将这个局部的变量拷贝到临时变量中
    return t;

}
//其他情况。。。。。。